package com.ainge.easystudy.thread;

import java.util.concurrent.CountDownLatch;

/**
 * @author: Ainge
 * @Time: 2021/8/30 00:37
 */
public class CountDownLatchTest {


    public static void main(String[] args) throws Exception {
        // 底层利用共享锁实现，设置state = 3
        CountDownLatch countDownLatch = new CountDownLatch(3);
        // 模拟开启三条线程处理数据，需要主线程阻塞到所有数据都处理完才返回。
        // 假设只用一条线程去处理三个业务，估计需要1+2+3=6秒，如果开三条线程，一个线程处理一个业务，那么只需要耗时最长的业务时间
        long startTime = System.currentTimeMillis();
        new Thread(()->{
            try{
                // 执行业务操作
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }finally {
                countDownLatch.countDown();
            }

        }).start();
        new Thread(()->{
            try{
                // 执行业务操作
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                }
            }finally {
                countDownLatch.countDown();
            }

        }).start();
        new Thread(()->{
            try{
                // 执行业务操作
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                }
            }finally {
                countDownLatch.countDown();
            }

        }).start();





        // 尝试获取共享锁，底层重写了tryAcquireShared，需要自旋到state == 0时，才能获取到锁。
        countDownLatch.await();
        // 所有业务执行成功，大约汇总一下时间。
        System.out.println("业务处理完成，大约耗时" + (System.currentTimeMillis() - startTime) +" ms");

    }

}
